package com.ics.atable.chat.config;

import com.ics.atable.chat.mapper.DbConfigMapper;
import com.ics.atable.chat.model.entity.DbConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 数据源配置类
 * 
 * 在应用启动时自动加载数据库配置并初始化数据源
 * 实现CommandLineRunner接口，在Spring Boot启动完成后执行
 * 
 * @author Chawu
 */
@Slf4j
@Component
public class DataSourceConfig implements CommandLineRunner {
    
    @Autowired
    private DbConfigMapper dbConfigMapper;
    
    @Autowired
    private DynamicDataSourceManager dynamicDataSourceManager;
    
    /**
     * 应用启动完成后执行的方法
     * 从数据库中加载所有启用的数据源配置并初始化
     * 
     * @param args 启动参数
     * @throws Exception 异常
     */
    @Override
    public void run(String... args) throws Exception {
        log.info("开始初始化动态数据源...");
        
        try {
            // 查询所有启用的数据源配置
            List<DbConfig> enabledConfigs = dbConfigMapper.selectEnabledConfigs();
            
            if (enabledConfigs.isEmpty()) {
                log.warn("未找到启用的数据源配置");
                return;
            }
            
            // 初始化每个数据源
            for (DbConfig config : enabledConfigs) {
                try {
                    dynamicDataSourceManager.addDataSource(config);
                    log.info("成功初始化数据源: {}", config.getName());
                } catch (Exception e) {
                    log.error("初始化数据源失败: {}, 错误信息: {}", config.getName(), e.getMessage(), e);
                }
            }
            
            log.info("动态数据源初始化完成，共初始化 {} 个数据源", enabledConfigs.size());
            
        } catch (Exception e) {
            log.error("初始化动态数据源时发生错误: {}", e.getMessage(), e);
            throw e;
        }
    }
}
